<?php
namespace Swiftx\Interfaces\DataBase;

/**
 * 数据库对象
 *
 * @author      胡永强 <odaytudio@gmail.com>
 * @since       2015-12-08
 * @copyright   Copyright (c) 2014-2015 swiftx Inc. (http://swiftx.oday.me/)
 *
 * @property string $Host 主机名
 * @property string $Name 数据库名
 * @property string $Username 用户账号
 * @property string $Password 登陆密码
 * @property string $Port 端口号
 * @property string $Code 编码格式
 *
 * @throws Exception 301 数据库连接失败
 */
interface Session {

    /**
     * 主机地址
     * @return string
     */
    public function getHost():string;

    /**
     * 设置主机地址
     * @param string $value
     */
    public function setHost(string $value);

    /**
     * 数据库名
     * @return string
     */
    public function getName():string;

    /**
     * 设置数据库名
     * @param string $value
     */
    public function setName(string $value);

    /**
     * 登陆账号
     * @return string
     */
    public function getUsername():string;

    /**
     * 设置登陆账号
     * @param string $value
     */
    public function setUsername(string $value);

    /**
     * 登陆密码
     * @return string
     */
    public function getPassword():string;

    /**
     * 设置登陆密码
     * @param string $value
     */
    public function setPassword(string $value);

    /**
     * 端口号
     * @return int
     */
    public function getPort():int;

    /**
     * 设置端口号
     * @param int $value
     */
    public function setPort(int $value);

    /**
     * 编码格式
     * @return string
     */
    public function getCode();

    /**
     * 设置编码格式
     * @param int $value
     */
    public function setCode($value);

    /**
     * 进行数据库连接
     * @return void
     * @throws Exception 301 数据库连接失败
     */
    public function connect();

    /**
     * 数据库查询
     * @param $sql
     * @return array
     */
    public function query($sql);

    /**
     * 获取一条记录
     * @param string $sql
     * @return array|null
     */
    public function fetchRow(string $sql);

    /**
     * 获取多条记录
     * @param string $sql
     * @return array
     */
    public function fetchRows(string $sql):array;

    /**
     * 获取一个查询值
     * @param string $sql
     * @param string $name
     * @return mixed
     */
    public function fetchValue(string $sql, $name=null);

    /**
     * 进行分页查询
     * @param string $sql
     * @param int $current
     * @param int $number
     * @return Page
     */
    public function page(string $sql, int $current, int $number):Page;

    /**
     * 统计记录数
     * @param string $sql
     * @return int
     */
    public function count(string $sql):int;

    /**
     * 执行Sql语句
     * @param string $sql
     * @return int
     */
    public function excuse(string $sql):int;

    /**
     * 执行插入操作
     * @param string $sql
     * @return int
     */
    public function insert(string $sql):int;

    /**
     * 执行修改操作
     * @param string $sql
     * @return int
     */
    public function update(string $sql);

    /**
     * 执行删除操作
     * @param string $sql
     * @throws Exception
     * @return int
     */
    public function delete(string $sql):int;

    /**
     * 事物方式执行
     * @param callable $excuse
     * @param callable|null $success
     * @param callable|null $error
     * @return mixed
     */
    public function transaction(callable $excuse, callable $success=null, callable $error=null);


}